import _ from "lodash";
import Taro from "@tarojs/taro";

type Coord = {
  x: number;
  y: number;
};

// 长度计算
function getLen({ x, y }: Coord) {
  return Math.sqrt(x * x + y * y);
}

function dot(v1: Coord, v2: Coord) {
  return v1.x * v2.x + v1.y * v2.y;
}

function getAngle(v1: Coord, v2: Coord) {
  let area = getLen(v1) * getLen(v2);
  if (area === 0) return 0;
  let r = dot(v1, v2) / area;
  if (r > 1) r = 1;
  return Math.acos(r); // 返回角的弧度
}

function cross(v1: Coord, v2: Coord) {
  return v1.x * v2.x - v1.y * v2.y;
}

// 获取旋转角度（单位为角度）
function getRotateAngle(v1: Coord, v2: Coord): number {
  let angle = getAngle(v1, v2);
  if (cross(v1, v2) > 0) {
    angle *= -1;
  }
  return (angle * 180) / Math.PI;
}

// 获取中点的位置
function getCenterPosition(offsetX, offsetY, width, heigth) {
  return {
    x: offsetX + 0.5 * width,
    y: offsetY + 0.5 * heigth
  };
}

// 导出默认工具对象实例
export default new (class {
  // 生成uuid(因为是匿名对象所以不使用static关键字)
  public createUUID(): string {
    const UUID_TEMPLATE = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
    return UUID_TEMPLATE.replace(/[xy]/g, (c) => {
      const r = (Math.random() * 16) % 16 | 0;
      return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
    });
  }

  // 获取设备id
  public getDeviceId() {
    if (!Taro.getStorageSync("deviceId")) {
      // 生成一个随机UUID作为设备id
      Taro.setStorageSync("deviceId", this.createUUID());
    }
  }

  // 随机生成16进制字符串为图片命名(仍然有可能重复)
  public genImageName(length: number = 32) {
    return _.repeat("x", length).replace(/[\s\S]/g, () =>
      Math.floor(Math.random() * 0x10).toString(16)
    );
  }

  // 判断数组中元素是否有重复
  isRepeat(arr: any[]) {
    let _arr = _.uniq(arr);
    return _arr.length === arr.length;
  }

  getRotateAngle(v1: Coord, v2: Coord): number {
    // 将定义的function引用到tool实例上
    return getRotateAngle.call(this, v1, v2);
  }

  getCenterPosition(offsetX, offsetY, width, heigth) {
    return getCenterPosition.call(this, offsetX, offsetY, width, heigth);
  }
})();
